/*
* Sun Public License Notice
*
* The contents of this file are subject to the Sun Public License
* Version 1.0 (the "License"). You may not use this file except in
* compliance with the License. A copy of the License is available at
* http://www.sun.com/
*
* The Original Code is Forte for Java, Community Edition. The Initial
* Developer of the Original Code is Sun Microsystems, Inc. Portions
* Copyright 1997-2000 Sun Microsystems, Inc. All Rights Reserved.
*/
package org.openide.util;
import java.beans.*;
import java.lang.reflect.*;
import java.util.EventListener;
import java.awt.event.FocusListener;
import java.awt.event.FocusEvent;
import javax.swing.event.DocumentListener;
import javax.swing.event.DocumentEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;
import org.openide.filesystems.*;
import org.openide.loaders.OperationListener;
import org.openide.loaders.OperationEvent;
import org.openide.nodes.*;
/** Factory for JDK 1.3. Uses java.lang.reflect.Proxy
*
* @author Jaroslav Tulach
*/
final class WeakListener13 extends Object implements WeakListener.Factory {
public NodeListener node(NodeListener l,Object source) {
return (NodeListener)create (NodeListener.class, l, source);
}
public PropertyChangeListener propertyChange(PropertyChangeListener l,Object source) {
return (PropertyChangeListener)create (PropertyChangeListener.class, l, source);
}
public VetoableChangeListener vetoableChange(VetoableChangeListener l,Object source) {
return (VetoableChangeListener)create (VetoableChangeListener.class, l, source);
}
public FileChangeListener fileChange(FileChangeListener l,Object source) {
return (FileChangeListener)create (FileChangeListener.class, l, source);
}
public FileStatusListener fileStatus(FileStatusListener l,Object source) {
return (FileStatusListener)create (FileStatusListener.class, l, source);
}
public RepositoryListener repository(RepositoryListener l,Object source) {
return (RepositoryListener)create (RepositoryListener.class, l, source);
}
public DocumentListener document(DocumentListener l,Object source) {
// this is a special listener that cannot be used with the handler
// because DocumentEvent is not EventObject
WeakListener.Document wl = new WeakListener.Document (l);
wl.setSource (source);
return wl;
}
public ChangeListener change(ChangeListener l,Object source) {
return (ChangeListener) create (ChangeListener.class, l, source);
}
public FocusListener focus(FocusListener l,Object source) {
return (FocusListener) create (FocusListener.class, l, source);
}
public OperationListener operation (OperationListener l, Object source) {
return (OperationListener) create (OperationListener.class, l, source);
}
/** Creates a proxy for given class
*/
private static Object create (Class clazz, EventListener listener, Object source) {
ProxyListener pl = new ProxyListener (clazz, listener);
pl.setSource (source);
return pl.proxy;
}
/** Proxy interface that delegates to listeners.
*/
private static class ProxyListener extends WeakListener implements InvocationHandler {
/** proxy generated for this listener */
public final Object proxy;
/** @param listener listener to delegate to
*/
public ProxyListener (Class c, java.util.EventListener listener) {
super (c, listener);
proxy = Proxy.newProxyInstance (
c.getClassLoader (), new Class[] { c }, this
);
}
public java.lang.Object invoke (
Object proxy, Method method, Object[] args
) throws Throwable {
if (method.getDeclaringClass () == Object.class) {
// a method from object => call it on your self
return method.invoke (this, args);
}
// listeners method
java.util.EventObject ev = (java.util.EventObject)args[0];
Object listener = super.get (ev);
if (listener != null) {
return method.invoke (listener, args);
} else {
return null;
}
}
/** Remove method name is composed from the name of the listener.
*/
protected String removeMethodName () {
String name = listenerClass.getName ();
int dot = name.lastIndexOf('.');
name = name.substring (dot + 1);
return "remove" + name; // NOI18N
}
/** To string prints class.
*/
public String toString () {
return super.toString () + "[" + listenerClass + "]"; // NOI18N
}
/** Equal is extended to equal also with proxy object.
*/
public boolean equals (Object obj) {
return proxy == obj || this == obj;
}
}
}
/*
* Log
* 5 Gandalf 1.4 1/12/00 Pavel Buzek I18N
* 4 Gandalf 1.3 1/5/00 Jaroslav Tulach Added operation listener.
* 3 Gandalf 1.2 12/2/99 Jaroslav Tulach Performance improvements.
* 2 Gandalf 1.1 11/5/99 Jaroslav Tulach 1.3 works better.
* 1 Gandalf 1.0 11/5/99 Jaroslav Tulach
* $
*/